// 配置路由的地方

import Vue from "vue"
import VueRouter from "vue-router"
import routes from "./routes"
// 使用插件
Vue.use(VueRouter)


import store from "@/store"
// 为了解决编程式路由跳转到当前路由（参数不变），多次执行会抛出NavigationDuplicated警告错误
// 先把VueRouter原型对象的push，replace，先保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace
// 重写push|replace
// 第一个参数：告诉原来push方法，你往哪里跳转（传那些参数）
// 第二个参数：成功的回调
// 第三个参数：失败的回调
VueRouter.prototype.push = function (location, resolve, reject) {
    // console.log(this);
    if (resolve && reject) {
        // call和apply区别：
        // 相同点，都可以调用函数一次，都可以修改函数的上下文一次
        // 不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行传递数组
        originPush.call(this, location, resolve, reject)
    } else {
        originPush.call(this, location, () => { }, () => { })
    }
}

VueRouter.prototype.replace = function (location, resolve, reject) {
    // console.log(this);
    if (resolve && reject) {
        // call和apply区别：
        // 相同点，都可以调用函数一次，都可以修改函数的上下文一次
        // 不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行传递数组
        originReplace.call(this, location, resolve, reject)
    } else {
        originReplace.call(this, location, () => { }, () => { })
    }
}

// 配置路由
const router = new VueRouter({
    routes,
    //保证每次切换路由时，都在新页面的顶部
    scrollBehavior(to, from, savedPosition) {
        // return 期望滚动到哪个的位置
        return { y: 0 }
    }
})

// 全局守卫：前置守卫（在路由跳转之前进行判断）
router.beforeEach(async (to, from, next) => {
    // next:放行函数 next()放行 next(path)放行到指令路由 next(false):
    let token = store.state.user.token
    let name = store.state.user.userInfo.name
    if (token) {
        if (to.path == "/login" || to.path=="/register") {
            next("/")
        } else {
            if (name) {
                next()
            } else {
                // 没有用户信息，派发action让仓库存储用户信息再跳转
                try {
                    await store.dispatch("getUserInfo")
                    next()
                } catch (error) {
                    await store.dispatch("userLogout")
                    next("/login")
                }
            }
        }
    } else {
        next()
    }
})
export default router